4   '   ******************************************

6   '   ** (DFT6.01A) GENERATE/ANALYZE WAVEFORM **

8   '   ******************************************

10 GOSUB 900

12 Q = 4096: PI = 3.141592653589793#: P2 = 2 * PI: K1 = P2 / Q: K2 = 1 / PI

14 DIM C(2, Q), S(2, Q), KC(2, Q), KS(2, Q)

16 CLS : FOR J = 0 TO Q: FOR I = 1 TO 2: C(I, J) = 0: S(I, J) = 0: NEXT: NEXT

20 CLS :   ' *    MAIN MENU    *

22 PRINT : PRINT : PRINT "         MAIN MENU": PRINT

24 PRINT " 1 = TIME TRIALS": PRINT

31 PRINT " 2 = EXIT": PRINT : PRINT

32 PRINT SPC(10); "MAKE SELECTION";

34 A$ = INKEY$: IF A$ = "" THEN 34

36 A = VAL(A$): ON A GOSUB 300, 1000

38 GOTO 20

40 CLS : N = 1: M = 2: K5 = Q: K6 = -1: GOSUB 108

42 FOR J = 0 TO Q: C(2, J) = 0: S(2, J) = 0: NEXT

43 TIM9 = TIMER

44 GOSUB 200:   ' - PERFORM DFT

45 TIM9 = TIMER - TIM9

46 GOSUB 140:   ' - PRINT OUT FINAL VALUES

47 PRINT "TIME WAS "; TIM9; " SECONDS"

48 PRINT : INPUT "C/R TO CONTINUE"; A$

50 RETURN

80 CLS : GOSUB 150:   ' PRINT HEADING

81 FOR I = 0 TO Q - 1: C(1, I) = 0: S(1, I) = 0: NEXT

82 N = 2: M = 1: K5 = 1: K6 = 1

84 GOSUB 200:   ' INVERSE TRANSFORM

86 GOSUB 140:   ' PRINT OUTPUT

88 PRINT : INPUT "C/R TO CONTINUE"; A$

90 RETURN

100   '  ******************************************

102   '  *         PROGRAM SUBROUTINES            *

104   '  ******************************************

106   '  *       PRINT COLUMN HEADINGS            *

108 PRINT : PRINT : IF COR$ = "P" THEN 116

110 PRINT "FREQ    F(COS)      F(SIN)      FREQ     F(COS)    F(SIN)"

112 PRINT

114 RETURN

116 PRINT "FREQ      F(MAG)       F(THETA)    FREQ       F(MAG)     F(THETA)"

118 GOTO 112

137   ' ******************************

138   ' *       PRINT OUTPUT         *

139   ' ******************************

140 IF COR$ = "P" THEN GOSUB 170

141 FOR Z = 0 TO Q / 2 - 1

142 PRINT USING "####_  "; Z;

144 PRINT USING "+###.#####_    "; C(M, Z); S(M, Z);

145 PRINT USING "####_  "; (Z + Q / 2);

146 PRINT USING "+###.#####_    "; C(M, Z + Q / 2); S(M, Z + Q / 2)

147 NEXT Z

148 RETURN

150   ' ******************************

152   ' *    PRINT COLUMN HEADINGS   *

154 PRINT

156 PRINT "                       RECONSTRUCTION": PRINT

158 PRINT " T                              T": PRINT

160 RETURN

170   ' CONVERT FROM RECTANGULAR TO POLAR COORDINATES

172 FOR I = 0 TO Q - 1

174 MAG = SQR(C(M, I) ^ 2 + S(M, I) ^ 2)

175 IF C(M, I) = 0 THEN 190

176 ANGLE = 180 / PI * ATN(S(M, I) / C(M, I))

177 IF C(M, I) > 0 THEN S(M, I) = ANGLE: GOTO 180

178 IF ANGLE > 0 THEN S(M, I) = ANGLE - 180

179 IF ANGLE < 0 THEN S(M, I) = ANGLE + 180

180 C(M, I) = MAG: NEXT

182 RETURN

190 IF S(M, I) = 0 THEN S(M, I) = 0: GOTO 180

192 S(M, I) = 90: GOTO 180

200   ' *******************************

202   ' *     TRANSFORM/RECONSTRUCT   *

204   ' *******************************

206 FOR J = 0 TO Q - 1:   ' SOLVE EQNS FOR EACH FREQUENCY

208 FOR I = 0 TO Q - 1:   ' MULTIPLY AND SUM EACH POINT

210 C(M, J) = C(M, J) + C(N, I) * COS(J * I * K1) + K6 * S(N, I) * SIN(J * I * K1)

211 S(M, J) = S(M, J) - K6 * C(N, I) * SIN(J * I * K1) + S(N, I) * COS(J * I * K1)

212 NEXT I

214 C(M, J) = C(M, J) / K5: S(M, J) = S(M, J) / K5:   ' SCALE RESULTS

216 NEXT J

218 RETURN

299   '          **************************

300 CLS :   '    *       TIME  TRIALS     *

301 Q = 256:   ' **************************

302 FOR I = 0 TO Q - 1: C(1, I) = 0: S(1, I) = 0

304 FOR J = 1 TO 2: KC(J, I) = 0: KS(J, I) = 0: NEXT: NEXT

306 COR$ = "P"

310 INPUT "ARRAY SIZE AS POWER OF 2"; Q1

312 Q = 2 ^ Q1

324 FOR I = 0 TO Q - 1: C(1, I) = 0: S(1, I) = 0: NEXT

328 C(1, 0) = Q

332 M = 1

336 GOSUB 40:   ' TAKE XFORM

340 PRINT "CONTINUE ILLUSTRATION ? (Y/N)"

342 A$ = INKEY$: IF A$ = "" THEN 342

344 IF A$ <> "N" AND A$ <> "n" THEN 310

346 RETURN

900 CLS : SCREEN 9, 1, 1: COLOR 15, 1:   ' TEST DESCRIPTION

902 FOR DACNT = 1 TO 7

904 READ A$: PRINT SPC(5); A$

906 NEXT

908 PRINT : PRINT

910 INPUT "     ENTER TO CONTINUE"; A$

912 SCREEN 0, 0, 0: RETURN

920 DATA "                       TEST 1"

922 DATA " "

930 DATA "In this routine illustrates the time required to perform"

932 DATA "a DFT for various lengths of input data arrays."

934 DATA "[NOTE:  Modern computers have left the limitations of this"

936 DATA "program far behind.  We have had to open up the maximum"

938 DATA "array size to get significant execution times.]"

1000 STOP



